#ifndef MODULE_GENERAL_REG_H
#define MODULE_GENERAL_REG_H

#include <module_header_reg.h>

#include <stdint.h>
//-------------- 1个字节 -------------------
//寄存器0x40：保留
typedef struct{
    union{
        struct{
            uint8_t d0     : 1;
            uint8_t d1     : 1;
            uint8_t d2     : 1;
            uint8_t d3     : 1;
            uint8_t a0     : 1;
            uint8_t a1     : 1;
            uint8_t a2     : 1;
            uint8_t a3     : 1;
        };
        uint8_t value;
        uint8_t data[1];
    };
}master_update_reg_t;

//-------------- 1个字节 -------------------
//寄存器 0x41：Motor(1-3)中断寄存器
typedef struct{
    union{
        struct{
            uint8_t ca0     : 1;
            uint8_t ca1     : 1;
            uint8_t ca2     : 1;
            uint8_t ca3     : 1;
            uint8_t ca4     : 1;
            uint8_t ca5     : 1;
            uint8_t ca6     : 1;
            uint8_t ca7     : 1;
        };
        uint8_t value;
        uint8_t data[1];
    };
}slave_interrupt_reg_t;

//-------------- 1个字节 -------------------
//寄存器 0x42：模式选择

//-------------- 1个字节 -------------------
//寄存器 0x43：模式选择
typedef struct{
    union{
       struct{
            uint8_t value     : 1;//0:manual 1:condiction
            uint8_t           : 7;
        };
        uint8_t data[1];
    };
}mode_select_reg_t;

//-------------- 1个字节 -------------------
//寄存器 0x44：IO方向:输入输出
typedef struct{
    union{
        struct{
            uint8_t d0     : 1;
            uint8_t d1     : 1;
            uint8_t d2     : 1;
            uint8_t d3     : 1;
            uint8_t a0     : 1;//1:输出 0:输入
            uint8_t a1     : 1;
            uint8_t a2     : 1;
            uint8_t a3     : 1;
        };
        uint8_t value;
        uint8_t data[1];
    };
}io_direction_reg_t;


typedef enum{
    Input = 0,
    Output = 1
}IODirection;

// typedef enum{
//     Levelout = 0,
//     //PwmOut = 1,//not support
//     AnalogIn = 1,
//     DigitalIn = 0
// }IOTypePortA;

// typedef enum{
//     LevelOut = 0,
//     PwmOut = 1,
//     //AnalogIn = 1,//not support
//     DigitalIn
// }IOTypePortD;

typedef enum{
    LEVEL_OUT = 0,
    PWM_OUT = 1,         //D
    DIGITAL_IN = 0,
    ANALOG_IN = 1        //A
}IOTypeName;
//-------------- 1个字节 -------------------
//寄存器 0x45：IO类型
typedef struct{
    union{
        struct{
            uint8_t d0     : 1;//1:PWM信号 0:电平信号
            uint8_t d1     : 1;
            uint8_t d2     : 1;
            uint8_t d3     : 1;
            uint8_t a0     : 1;//1:模拟信号 0:数字信号
            uint8_t a1     : 1;
            uint8_t a2     : 1;
            uint8_t a3     : 1;
        };
        uint8_t value;
        uint8_t data[1];
    };
}io_type_reg_t;


typedef enum{
    Level3V3 = 0,
    Level5V = 1,
    Level10V = Level5V
}IOVoltageName;

//-------------- 1个字节 -------------------
//寄存器 0x46：电压
typedef struct{
    union{
        struct{
            uint8_t d0     : 1;//1:高压5V 0:低压3v3
            uint8_t d1     : 1;
            uint8_t d2     : 1;
            uint8_t d3     : 1;
            uint8_t a0     : 1;//1:高压10V 0:低压3v3
            uint8_t a1     : 1;
            uint8_t a2     : 1;
            uint8_t a3     : 1;
        };
        uint8_t value;
        uint8_t data[1];
    };
}io_voltage_reg_t;


//-------------- 1个字节 -------------------
//寄存器 0x47：条件动作使能
typedef struct{
    union{
        struct{
            uint8_t ca0     : 1;//1:使能 0:禁止
            uint8_t ca1     : 1;
            uint8_t ca2     : 1;
            uint8_t ca3     : 1;
            uint8_t ca4     : 1;
            uint8_t ca5     : 1;
            uint8_t ca6     : 1;
            uint8_t ca7     : 1;
        };
        uint8_t value;
        uint8_t data[1];
    };
}condition_action_enable_reg_t;

//-------------- 1个字节 -------------------
//寄存器 0x48：手动工作模式：A口数字量

//-------------- 1个字节 -------------------
//寄存器 0x49：手动工作模式：A口数字量
typedef struct{
    union{
        struct{
            uint8_t a0     : 1;//1:高电平 0:低电平
            uint8_t a1     : 1;
            uint8_t a2     : 1;
            uint8_t a3     : 1;
            uint8_t        : 4;
        };
        uint8_t value;
        uint8_t data[1];
    };
}aio_level_reg_t;

//-------------- 1个字节 -------------------
//寄存器 0x4A：手动工作模式：D口数字量
typedef struct{
    union{
        struct{
            uint8_t d0     : 1;//1:高电平 0:低电平
            uint8_t d1     : 1;
            uint8_t d2     : 1;
            uint8_t d3     : 1;
            uint8_t        : 4;
        };
        uint8_t value;
        uint8_t data[1];
    };
}dio_level_reg_t;


//-------------- 2个字节 -------------------
//寄存器 0x4B-0x4C, 0x4D-0x4E, 0x4F-0x50, 0x51-0x52：手动工作模式：A口模拟量
typedef struct{
    union{
        struct{
            uint16_t value     : 10;//110位ADC:最大1023
            uint16_t           : 6;
        };
        uint8_t data[2];
    };
}slave_analog_in_reg_t;
typedef struct{
    union{
        slave_analog_in_reg_t A0;
        slave_analog_in_reg_t A1;
        slave_analog_in_reg_t A2;
        slave_analog_in_reg_t A3;
        uint8_t data[8];
    };
}ain_reg_t;

//-------------- 1个字节 -------------------
//寄存器 0x53：保留

//-------------- 5个字节 -------------------
//寄存器 0x54， 0x55-0x56-0x57-0x58：手动工作模式：D口PWM
typedef struct{
    union{
        struct
        {
            union{
                struct{
                    uint8_t d01      : 3;
                    uint8_t          : 1;
                    uint8_t d23      : 3;
                    uint8_t          : 1;
                };
                uint8_t value;
                uint8_t data[1];
            }freq;

            union{
                struct{
                    uint8_t d0;
                    uint8_t d1;
                    uint8_t d2;
                    uint8_t d3;
                };
                uint32_t value;
                uint8_t data[4];
            }duty_cycle;
        };
        uint8_t data[5];
    };
}pwm_reg_t;

//-------------- 1个字节 -------------------
//寄存器 0x59-0x5A：保留


typedef struct{
    union{
        struct{
            uint16_t     threshold        : 10;//10位ADC阈值
            uint16_t     high_voltage    :  1;//1:高压 0:低压
            uint16_t     operate_symbol  :  3;//比较符 （><=!=）
            uint16_t     pin_name        :  2;//管脚名A0-A3
        };
        uint8_t data[2];
        uint16_t value;
    };
}input_condition_details_t;

typedef struct{
    union{
        struct{
            uint32_t     threshold       : 21;//10位ADC阈值
            uint32_t     operate_symbol  :  3;//比较符 （><=!=）
            uint32_t                     :  8;//保留-扩展使用
        };
        uint8_t data[4];
        uint32_t value;
    };
}auto_mode_time_condition_t;
//-------------- 32个字节 -------------------
//寄存器 0x5B +0x20：输入条件 0x7A
typedef struct{
    union{
        struct{
            union{
                input_condition_details_t A0[4];//0x59-0x60
                uint8_t a0_data[8];
            };
           union{
                input_condition_details_t A1[4];//0x61-0x68
                uint8_t a1_data[8];
           };
           union{
                input_condition_details_t A2[4];//0x69-0x70
                uint8_t a2_data[8];
           };
           union{
                input_condition_details_t A3[4];//0x71-0x78
                uint8_t a3_data[8];
           };
        };
        uint8_t data[32];
        input_condition_details_t conditions[16];
    };
}general_input_condition_reg_t;

//-------------- 32个字节 -------------------
//寄存器 0x7B +0x20：输出条件 0x9A
typedef struct{
    union{
        struct{
            uint16_t    duty_cycle       :  8;//占空比
            uint16_t    freq_num         :  3;//频率编号0-4
            uint16_t                     :  1;//保留
            uint16_t    output_type      :  1;//输出类型：PWM/高低电平
            uint16_t    voltage_type     :  1;//电压类型：高压/低压
            uint16_t   pin_name          :  2;//管脚名D0-D3
        };
        uint8_t data[2];
    };
}output_action_details_t;

typedef struct{
    union{
        output_action_details_t actions[4];//0x79-0x80
        uint8_t data[8];
    };
}output_action_t;
typedef struct{
    union{
        struct{
           output_action_t output_action_d0;
           output_action_t output_action_d1;
           output_action_t output_action_d2;
           output_action_t output_action_d3;
        };
        uint8_t data[32];
        output_action_t dio[4];
        output_action_details_t actions[16];
    };
}general_output_action_reg_t;

//-------------- 32个字节 -------------------
//寄存器 0x9B + 24：时间条件 0xB2：使用虚拟地址
typedef struct{
    union{
        uint8_t data[32];
        auto_mode_time_condition_t conditions[8];
    };
}general_time_condition_reg_t;




typedef struct{
    union{
        struct
        {
           uint8_t num:4;//INPUT条件编号
           uint8_t  en:1;
           uint8_t    :3;
        };
        uint8_t data[1];
    };
}auto_mode_logic_input_condition_t;
typedef struct{
    union{
        struct
        {
           uint8_t  sn0:3;//时间序号
           uint8_t  en0:1;
           uint8_t  sn1:3;//序号
           uint8_t  en1:1;
        };
        uint8_t data[1];
    };
}auto_mode_logic_time_condition_t;
typedef struct{
    union{
        struct
        {
           uint8_t  num:4;//OUTPUT动作编号
           uint8_t  en:1;
           uint8_t    :3;
        };
        uint8_t data[1];
    };
}auto_mode_logic_output_action_t;

typedef struct{
    union{
        struct
        {
            auto_mode_logic_input_condition_t logic_input_condition[2];
            auto_mode_logic_time_condition_t      logic_time_condition;
            auto_mode_logic_output_action_t     logic_output_action[2];
        };
        uint8_t data[5];
    };
}auto_mode_condition_and_action_t;

//-------------- 32个字节 -------------------
//寄存器 0xB3+40：条件 + 动作 0xDA
typedef struct{
    union{
        auto_mode_condition_and_action_t conditions[8];
        uint8_t data[40];
    };
}general_condition_and_action_reg_t;






//-------------- 161个字节 -------------------
typedef struct
{
    union{
        struct{
            master_update_reg_t                                     master_update_reg;//0x40:1字节
            slave_interrupt_reg_t                                 slave_interrupt_reg;//0x41:1字节
            module_reserved_reg_t                              module_reserved_42_reg;//0x42:1字节
            mode_select_reg_t                                         mode_select_reg;//0x43:1字节
            io_direction_reg_t                                       io_direction_reg;//0x44:1字节
            io_type_reg_t                                     io_type_reg;//0x45:1字节
            io_voltage_reg_t                                           io_voltage_reg;//0x46:1字节
            condition_action_enable_reg_t                 condition_action_enable_reg;//0x47:1字节
            module_reserved_reg_t                              module_reserved_48_reg;//0x48:1字节
            aio_level_reg_t                                             aio_level_reg;//0x49:1字节
            dio_level_reg_t                         dio_level_reg;//0x4A:1字节      -> sum=11字节
            ain_reg_t                               ain_reg;//0x4B-0x52:2字节x4=8(A0-A3) -> sum=19字节
            module_reserved_reg_t                              module_reserved_53_reg;//保留：0x53      -> sum=20字节
            pwm_reg_t                                   pwm_reg;//0x54-0x58：5字节-> sum=25字节
            module_reserved_reg_t                        module_reserved_59_5A_reg[2];//保留：0x59-0x5A -> sum=27字节
            general_input_condition_reg_t                 general_input_condition_reg;//0x5B-0x7A:32字节-> sum=59字节
            general_output_action_reg_t                     general_output_action_reg;//0x7B-0x9A:32字节-> sum=91字节
            general_time_condition_reg_t                   general_time_condition_reg;//0x9B-0xB2:实际占用32字节-> sum=123字节
            general_condition_and_action_reg_t       general_condition_and_action_reg;//0xB3-0xDA:实际占用40字节-> sum=163字节
        };
        uint8_t data[163];
    };
    
}module_general_reg_t;


typedef struct
{
    module_header_reg_t       module_header_reg;//40字节
    module_general_reg_t module_general_reg;//161字节
}module_reg_t;


#define DATA_STORAGE_GENERAL_REG_SIZE  sizeof(module_general_reg_t)
#endif